// vue的数据有多种  data computed watch
import { observe } from "./observe/index";

export function initState(vm) {
  // 将所有数据定义在vm属性上&后续更改需要触发视图更新

  // 获取用户属性
  const opts = vm.$options;

  if (opts.props) {
  }
  if (opts.method) {
  }
  if (opts.computed) {
  }
  if (opts.watch) {
  }
  if (opts.data) {
    initData(vm);
  }
}

function proxy(vm, source, key) {
  Object.defineProperty(vm, key, {
    get() {
      // vm.msg ==> vm._data.msg
      return vm[source][key];
    },

    set(v) {
      vm[source][key] = v;
    },
  });
}

function initData(vm) {
  // 数据劫持Object.defineProperty();
  let data = vm.$options.data;
  // 判断data的类型
  // 如果是函数获取函数的返回值作为对象
  data = vm._data = typeof data === "function" ? data.call(vm) : data;

  vm.$data = data;

  //通过vm._data获取劫持后的数据，用户就可以拿到_data数据
  //将_data种的数据全部放到vm上
  for (let key in data) {
    proxy(vm, "_data", key); // vm.name ==> vm._data.name
  }
  // 观测这个状态
  // observe(data);
  observe(data);
}
